package com.zjsru.plan2024.oneday;

/**
 * 2928. 给小朋友们分糖果 I
 * @Author: cookLee
 * @Date: 2024-06-02
 */
public class DistributeCandiesI {

    /**
     * 主
     * \
     * 输入：n = 5, limit = 2
     * 输出：3
     * 解释：总共有 3 种方法分配 5 颗糖果，且每位小朋友的糖果数不超过 2 ：(1, 2, 2) ，(2, 1, 2) 和 (2, 2, 1) 。
     * \
     * 输入：n = 3, limit = 3
     * 输出：10
     * 解释：总共有 10 种方法分配 3 颗糖果，且每位小朋友的糖果数不超过 3 ：(0, 0, 3) ，(0, 1, 2) ，(0, 2, 1) ，(0, 3, 0) ，(1, 0, 2) ，(1, 1, 1) ，(1, 2, 0) ，(2, 0, 1) ，(2, 1, 0) 和 (3, 0, 0) 。
     * \
     * @param args args
     */
    public static void main(String[] args) {
        DistributeCandiesI distributeCandies = new DistributeCandiesI();
        int n = 5;
        int limit = 2;
        System.out.println(distributeCandies.distributeCandies2(n, limit));
    }

    /**
     * 分发糖果：枚举模拟
     * @param n     n
     * @param limit 限制
     * @return int
     */
    public int distributeCandies(int n, int limit) {
        int ans = 0;
        for (int i = 0; i <= limit; i++) {
            for (int j = 0; j <= limit; j++) {
                //糖果不够分
                if (i + j > n) {
                    break;
                }
                //第三个人得到的糖果
                if (n - i - j <= limit) {
                    ans++;
                }
            }
        }
        return ans;
    }

    /**
     * 分发候选人2:枚举模拟
     *
     * @param n     n
     * @param limit 限制
     * @return int
     */
    public int distributeCandies2(int n, int limit) {
        int ans = 0;
        for (int i = 0; i <= Math.min(limit, n); i++) {
            //糖果不够分
            if (n - i > 2 * limit) {
                continue;
            }
            //第二个,第三个孩子最多能拿 limit 颗糖，最少 0 颗,代表方案数
            ans += Math.min(n - i, limit) - Math.max(0, n - i - limit) + 1;
        }
        return ans;
    }


}
